package com.javase.多线程.线程池的四种创建方式;

import java.sql.Statement;
import java.util.concurrent.*;

/**
 * @Auther: liyanhao
 * @Description: 线程池的创建方式
 * @Date: 2022/5/14 21:38
 * @Version: v1.0
 */
public class MainTest {
    public static void main(String[] args) {
        //1 newFixedThreadPool
        // 线程数固定的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        executorService.execute(()->{
          System.out.println("123123");
        });
        executorService.execute(()->{
            System.out.println("123123123");
        });
        //3 newScheduledThreadPool
        //它的核心线程数是固定的，对于非核心线程救护可以说是没有限制的，并且当非核心线程处于限制状态的时候就会立即回收
        //延迟一定时间后之心runable任务，延迟一定时间后执行callable任务，延迟一定使劲后，以间隔period时间的频率周期性的执行任务
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(4);
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "延迟三秒执行");
            }
        }, 3, TimeUnit.SECONDS);
        ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "延迟三秒后每隔2秒执行");
            }
        }, 3, 2, TimeUnit.SECONDS);


    }
    //2 newCachedThreadPool 核心线程数为0，线程池的最大线程数Integer.Max_Value,而Integer.Max_Value是一个很大的数，
    // 也差不多可以说这个线程池中的最大线程数可以任意大
    public static ExecutorService newCachedThreadPool(){
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                60l, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
    }
    //4 通过Executors中的newSingleThreadExector方法来创建，在这个线程池中又一个核心线程，对于任务队列没有大小限制，也就以为者这一个任务处于活动状态时，其他
    //任务都会在任务队列中排队等候一次执行。
    //newSingleThreadExecutor 将所有的外接任务同一到一个线程中支持，所以这这个任务执行纸巾啊我们不需要处理线程同步的问题
    public static  ExecutorService newSingleThreadExecutor(){
        return new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
    }



}
